/**
 * 
 */
package com.ccjq.shosestore.core.utils;

import org.springframework.beans.BeanUtils;

/**
 * vo、bo、po对象转换工具类
 * 
 * @author xugang
 *
 */
public class PojoUtils {

	/**
	 * 对象属性拷贝
	 * 
	 * @param source      源对象
	 * @param targetClazz 目标对象类型
	 * @param             <S> 源对象类型定义
	 * @param             <T> 目标对象类型定义
	 * @return 返回目标对象实例
	 */
	public static <S, T> T copyProperties(S source, Class<T> targetClazz) {
		T target = null;
		try {
			target = targetClazz.newInstance();
			BeanUtils.copyProperties(source, target);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return target;
	}

	/**
	 * 对象属性拷贝
	 * 
	 * @param source 源对象
	 * @param target 目标对象
	 * @param        <S> 源对象类型定义
	 * @param        <T> 目标对象类型定义
	 * @return 返回目标对象
	 */
	public static <S, T> T copyProperties(S source, T target) {
		BeanUtils.copyProperties(source, target);
		return target;
	}

	/**
	 * 持久层数据模型转换成业务数据模型
	 * 
	 * @param p     持久层数据对象
	 * @param clazz 业务数据对象类型
	 * @param       <P> 持久层数据模型类型定义
	 * @param       <T> 业务数据模型类型定义
	 * @return 返回业务层数据模型实例
	 */
	public static <P, T> T po2bo(P p, Class<T> clazz) {
		T t = null;
		try {
			t = clazz.newInstance();
			BeanUtils.copyProperties(p, t);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return t;
	}

	/**
	 * 业务数据模型转换成持久层数据模型
	 * 
	 * @param t     业务数据对象
	 * @param clazz 持久层数据对象类型
	 * @param       <T> 业务数据模型类型定义
	 * @param       <P> 持久层数据模型类型定义
	 * @return 返回持久层数据模型实例
	 */
	public static <T, P> P bo2po(T t, Class<P> clazz) {
		P p = null;
		try {
			p = clazz.newInstance();
			BeanUtils.copyProperties(t, p);
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return p;
	}
}
